1_spline.f90 Source File


Source Code

module spline_module
    !! сплайны
    use kind_module
    implicit none
    
contains
    subroutine splne(x,y,n,y2)
        integer, parameter :: nn=3001
        real(wp), parameter :: zero=0d0
        integer n
        real(wp) x(n),y(n),y2(n),u(nn)
        integer i,k
        real(wp) p,qn,un,sig
        if(n.gt.nn) stop 'n>nn in splne!'
            y2(1)=zero
            u(1)=zero
            do i=2,n-1
                sig=(x(i)-x(i-1))/(x(i+1)-x(i-1))
                p=sig*y2(i-1)+2.d0
                y2(i)=(sig-1.d0)/p
                u(i)=(6.d0*((y(i+1)-y(i))/(x(i+1)-x(i))-(y(i)-y(i-1))/(x(i)-x(i-1)))/(x(i+1)-x(i-1))-sig*u(i-1))/p
            end do
            qn=zero
            un=zero
            y2(n)=(un-qn*u(n-1))/(qn*y2(n-1)+1.d0)
            do k=n-1,1,-1
                y2(k)=y2(k)*y2(k+1)+u(k)
            end do
    return
    end

    subroutine splnt(xa,ya,y2a,n,x,y,dy)
        real(wp), parameter :: zero=0d0
        integer n
        real(wp) xa(n),ya(n),y2a(n)
        integer k, klo, khi
        real(wp) x,h,a,b,aa,bb,hh,ax,bx,y,dy
        klo=1
        khi=n
        do while(khi-klo.gt.1)
            k=(khi+klo)/2
            if(xa(k).gt.x)then
                khi=k
            else
                klo=k
            endif
        end do
        h=xa(khi)-xa(klo)
        if(h.eq.zero) then
            write(*,*)'bad x input in splnt(), x=',x
            write(*,*)'klo=',klo,' kho=',khi
            stop
        end if
        a=(xa(khi)-x)/h
        b=(x-xa(klo))/h
        aa=a**2
        bb=b**2
        hh=h**2/6d0
        ax=-1d0/h
        bx=-ax
        y=a*ya(klo)+b*ya(khi)+(a*(aa-1d0)*y2a(klo)+b*(bb-1d0)*y2a(khi))*hh
        dy=ax*ya(klo)+bx*ya(khi)+ax*((3.d0*aa-1d0)*y2a(klo)-(3.d0*bb-1d0)*y2a(khi))*hh
    end
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    subroutine dsplnt(xa,ya,y2a,n,x,y,dy,ddy)
        real(wp), parameter :: zero=0d0
        integer n
        real(wp) xa(n),ya(n),y2a(n)
        integer k, klo, khi
        real(wp) x,h,a,b,aa,bb,hh,ax,bx,y,dy,ddy        
        klo=1
        khi=n
        do while(khi-klo.gt.1)
            k=(khi+klo)/2
            if(xa(k).gt.x)then
                khi=k
            else
                klo=k
            endif
        end do
        h=xa(khi)-xa(klo)
        if(h.eq.zero) then
            write(*,*)'bad x input in splnt(), x=',x
            write(*,*)'klo=',klo,' kho=',khi
            stop
        end if
        a=(xa(khi)-x)/h
        b=(x-xa(klo))/h
        aa=a**2
        bb=b**2
        hh=h**2/6d0
        ax=-1d0/h
        bx=-ax
        y=a*ya(klo)+b*ya(khi)+(a*(aa-1d0)*y2a(klo)+b*(bb-1d0)*y2a(khi))*hh
        dy=ax*ya(klo)+bx*ya(khi)+ax*((3.d0*aa-1d0)*y2a(klo)-(3.d0*bb-1d0)*y2a(khi))*hh
        ddy=6.d0*ax*ax*(a*y2a(klo)+b*y2a(khi))*hh
    end   
end module spline_module